import { tap } from 'rxjs/operators';
import { of } from 'rxjs';
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { CookieService } from './cookie.service';

@Injectable({
  providedIn: 'root',
})
export class I18NService {
  languageKey = 'livelanguage'; // 语言key值

  language: string; // 语言, 默认支持zh-cn, en-us

  resource = {}; // 国际化资源

  constructor(private http: HttpClient, private cookie: CookieService) {
    this.initLanguage();
  }

  /**
   * 语言初始化
   * 优先级: 1.cookie 2.默认zh-cn 3.浏览器语言(默认语言和浏览器语言根据需求使用)
   */
  initLanguage(): void {
    const lang = (this.cookie.get(this.languageKey) || navigator.language || 'zh-cn').toLowerCase();
    this.language = lang.indexOf('zh') !== -1 ? 'zh-cn' : 'en-us';
  }

  /**
   * 切换语言, 会重新加载页面
   * @param language 语言
   */
  changeLanguage(language: string): void {
    this.language = language;
    this.cookie.set(this.languageKey, this.language);
    window.location.reload();
  }

  /**
   * 加载国际化资源
   * @param resource 远端资源地址(en/i18n.json)或资源对象({xxkeyid:xxkeyvalue})
   */
  load(resource: string): { [key: string]: any } {
    if (typeof resource === 'string') {
      return this.http.get(resource, { params: { $prefix: 'none' } }).pipe(
        tap(r => {
          Object.assign(this.resource, r);
        })
      );
    } else {
      return of(resource).pipe(
        tap(() => {
          Object.assign(this.resource, resource);
        })
      );
    }
  }

  /**
   * 获取国际化信息
   * @param key     i18n资源的key
   * @param params  i18n中占位符内要填充的内容
   * @param colon   是否要带冒号输出，默认不带冒号（false）
   */
  get(key: string, params = [], colon?: boolean): string {
    let i18nStr = this.resource[key] || key;

    params.forEach((param, index) => {
      i18nStr = i18nStr.replace(`{${index}}`, param);
    });

    if (typeof i18nStr === 'string') {
      i18nStr += colon ? (this.language === 'zh-cn' ? '：' : ':') : '';
    }

    return i18nStr;
  }
}
